/*
 * @Author: xiaohao
 * @Date: 2025-10-31 12:41:29
 * @LastEditors: xiaohao
 * @LastEditTime: 2025-10-31 19:26:05
 * @FilePath: /lesson24/POSIX_demo.cc
 * @Description:
 */
#include <iostream>
#include <cstdio>
#include <pthread.h>
#include <string>
#include <unistd.h>

int flag = 0;

void showtid(pthread_t &tid)
{
    printf("tid: 0x%lx\n", tid);
}

std::string FormatId(const pthread_t &tid)
{
    char id[64];
    snprintf(id, sizeof(id), "0x%lx", tid);
    return id;
}

void *routine(void *args)
{
    std::string name = static_cast<const char *>(args);
    pthread_t tid = pthread_self();
    int cnt = 5;
    while (true)
    {
        std::cout << "我是一个新线程: 我的名字是: " << name << "我的Id是: " << FormatId(tid) <<std::endl;
        flag++;
        sleep(1);
    }
    return nullptr;
}

int main()
{
    // 1.创建线程:
    // int pthread_create(pthread_t *restrict thread, const pthread_attr_t *restrict attr, void *(*start_routine)(void *),  void *restrict arg);
    // pthread_t *restrict thread: 线程ID 输出型参数
    // const pthread_attr_t *restrict attr: 线程属性 输入型参数 一般为nullptr
    // void *(*start_routine)(void *): 返回值为void*, 参数为void*的函数指针 回调机制 新线程要执行的函数入口
    // void *restrict arg: start_routine的函数参数
    // success 0
    pthread_t tid;
    int n = pthread_create(&tid, nullptr, routine, (void *)"thread-1");
    showtid(tid);

    int cnt = 5;
    while (true)
    {
        std::cout << "我是main线程: 我的名字是: main thread" << "我的Id是: " << FormatId(pthread_self()) << std::endl;
        std::cout << flag << std::endl;
        sleep(1);
    }

    // 2.线程创建好后,新线程要被主线程等待
    // int pthread_join(pthread_t thread, void **retval);
    // pthread_t thread: 线程ID
    // void **retval: 查看新线程执行任务函数的返回值
    // 不关心时设置nullptr
    pthread_join(tid, nullptr);

    return 0;
}